home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 1 Issue 2
/
PDCD-1 - Issue 02.iso
/
_utilities
/
utilities
/
001
/
_basicaof
/
Examples
/
!Wallpaper
/
c
/
WallP_wimp
Wrap
Text File
|
1994-01-03
|
8KB
|
234 lines
#include <stdlib.h>
#include "wimp.h"
#include "wimpt.h"
#include "win.h"
#include "event.h"
#include "baricon.h"
#include "sprite.h"
#include "werr.h"
#include "res.h"
#include "resspr.h"
#include "flex.h"
#include "template.h"
#include "bbc.h"
#include "colourtran.h"
#include "os.h"
#include "dbox.h"
#include "saveas.h"
#include "Wallpaper.h" /* constants and external declarations of assembler function */
enum iconbar_menu_entries
{
iconbar_Info = 1,
iconbar_Save,
iconbar_Freeze,
iconbar_Quit
};
static spr_details my_sprite; /* Sprite in which to render */
static wimp_w displaywin_handle; /* Window for wallpaper */
static menu iconbar_menu; /* Iconbar menu */
static BOOL displaying = FALSE; /* Window on display? */
static BOOL frozen = FALSE; /* Window display frozen? */
static sprite_pixtrans translate[16], *pixtrans;
/*==================================================================*/
static void create_sprite(spr_details *my_sprite)
{
sprite_ptr ptr;
if (flex_alloc((flex_ptr)&my_sprite->area, SpriteSize) == 0)
werr(TRUE, "Fatal error - failed to allocate store for sprite");
sprite_area_initialise(my_sprite->area, SpriteSize);
/* create a sprite within that area */
wimpt_complain(sprite_create(my_sprite->area, "sprite",
sprite_nopalette, SpriteWidth, SpriteHeight, SpriteMode));
my_sprite->id.tag = sprite_id_name;
my_sprite->id.s.name = "sprite";
/* select the sprite and get a pointer to it (faster) */
wimpt_complain(sprite_select_rp(my_sprite->area, &my_sprite->id, &ptr));
my_sprite->id.tag = sprite_id_addr;
my_sprite->id.s.addr = ptr;
}
/*==================================================================*/
static void create_displaywin(wimp_w *handle)
{
wimp_wind *window;
/* find template for our window and create a window from it */
window = template_syshandle("MainWindow");
wimp_create_wind(window, handle);
}
/*==================================================================*/
static void redo_window(wimp_redrawstr r, BOOL *more)
{
int sx = SpriteHeight<<2;
sprite_factors factors;
/* Ask how the WIMP would scale this sprite */
/* In 4bpp modes pix trans table is not used */
wimp_readpixtrans(my_sprite.area, &my_sprite.id, &factors, translate);
while (*more)
{
wimpt_complain(sprite_put_scaled(my_sprite.area, &my_sprite.id, 0,
r.box.x0-r.scx, r.box.y1-r.scy-sx, &factors, pixtrans));
wimp_get_rectangle(&r, more);
}
}
/*==================================================================*/
static void redraw_window(wimp_w handle)
{
BOOL more;
wimp_redrawstr r;
r.w = handle;
wimp_redraw_wind(&r, &more);
if (more) redo_window(r, &more);
}
/*==================================================================*/
static void update_window(void)
{
wimp_wstate state;
wimp_redrawstr r;
BOOL more;
wimpt_complain(wimp_get_wind_state(displaywin_handle, &state));
r.w = displaywin_handle;
r.box.x0 = state.o.x;
r.box.x1 = state.o.x+(state.o.box.x1-state.o.box.x0);
r.box.y0 = state.o.y-(state.o.box.y1-state.o.box.y0);
r.box.y1 = state.o.y;
wimp_update_wind(&r, &more);
if (more) redo_window(r, &more);
}
/*==================================================================*/
static void leftclickproc(wimp_i i)
{
wimp_wstate state;
wimp_redrawstr r;
IGNORE(i);
if (!displaying)
{
wimpt_noerr(wimp_get_wind_state(displaywin_handle, &state));
state.o.behind = -1; /* open in front */
wimp_open_wind(&state.o);
r.w = displaywin_handle; /* force a redraw of the whole window */
r.box.x0 = 0;
r.box.x1 = (SpriteWidth <<1);
r.box.y0 = -(SpriteHeight<<2);
r.box.y1 = 0;
wimp_force_redraw(&r);
displaying = TRUE;
}
}
/*==================================================================*/
static void animate_wallpaper()
{
static size=WALLPAPER_MAXSIZE, d=-1;
if (size<1 || size>WALLPAPER_MAXSIZE) d=-d;
size += d;
Wallpaper( size, my_sprite.id.s.addr);
update_window();
}
/*==================================================================*/
static void handler(wimp_eventstr *e, void *handle)
{
handle = handle;
switch (e->e)
{
case wimp_ENULL:
if(displaying) animate_wallpaper();
break;
case wimp_EREDRAW:
redraw_window(e->data.o.w);
break;
case wimp_EOPEN:
wimp_open_wind(&e->data.o);
break;
case wimp_ECLOSE:
wimpt_noerr(wimp_close_wind(e->data.o.w));
displaying = FALSE;
break;
case wimp_ESEND:
case wimp_ESENDWANTACK: /* this code checks for mode/palette broadcasts */
switch(e->data.msg.hdr.action)
{
case wimp_MMODECHANGE:
wimpt_checkmode();
pixtrans = (wimpt_bpp()==4) ? 0 : translate;
/* no break, drops down */
case wimp_PALETTECHANGE:
wimpt_complain(colourtran_select_table(SpriteMode, 0, -1,
(wimp_paletteword *)-1, translate));
break;
}
}
}
/*==================================================================*/
static void info_aboutprog(void)
{
dbox d = dbox_new("ProgInfo");
if (d==0) return;
dbox_show(d);
dbox_fillin(d);
dbox_dispose(&d);
}
/*==================================================================*/
static BOOL saver(char *filename, void *handle)
{
IGNORE(handle);
return !wimpt_complain(sprite_area_save(my_sprite.area, filename));
}
/*==================================================================*/
static void menuproc(void *handle, char *hit)
{
IGNORE(handle);
switch(hit[0])
{
case iconbar_Info:
info_aboutprog();
break;
case iconbar_Save:
saveas(SpriteFile, "Wallpaper", SpriteSize, saver,0,0,0);
break;
case iconbar_Freeze:
event_setmask(frozen^=1 ? event_getmask() | wimp_EMNULL :
event_getmask() &~wimp_EMNULL );
menu_setflags(iconbar_menu, iconbar_Freeze, frozen, 0);
break;
case iconbar_Quit:
exit(0);
break;
}
}
/*==================================================================*/
static void initialise(void)
{
wimpt_init("Wallpaper");
res_init("Wallpaper");
resspr_init();
flex_init();
template_init();
dbox_init();
wimpt_checkmode();
pixtrans = (wimpt_bpp()==4) ? 0 : translate;
wimpt_complain(colourtran_select_table(SpriteMode,0,-1,
(wimp_paletteword *)-1, translate));
create_sprite(&my_sprite);
create_displaywin(&displaywin_handle);
win_register_event_handler(displaywin_handle, handler, 0);
win_claim_idle_events(displaywin_handle);
win_claim_unknown_events(displaywin_handle);
baricon("!Wallpaper", 1, leftclickproc);
iconbar_menu = menu_new("Wallpaper", ">Info,>Save,Freeze,Quit");
event_attachmenu(win_ICONBAR, iconbar_menu, menuproc, 0);
}
/*==================================================================*/
int main()
{
initialise();
event_setmask(wimp_EMPTRENTER | wimp_EMPTRLEAVE);
for (;;)
event_process();
}
/*==================================================================*/